package rest

import (
	"net/url"
	"os"

	"gitee.com/youkelike/ziam/zutils/runtime"
	yaml "gopkg.in/yaml.v3"
)

// 传入配置文件内容，解析得到 Config
func ConfigFromBytes(configBytes []byte) (*Config, error) {
	config := &Config{}
	// if there's no data in a file, return the default object instead of failing (DecodeInto reject empty input)
	if len(configBytes) == 0 {
		return config, nil
	}

	if err := yaml.Unmarshal(configBytes, config); err != nil {
		return nil, err
	}

	// 如果 Host 字段中包含 path，且 path 部分不仅仅只是 “/”，就对它做一下规范处理：去掉 query、fragment 部分
	if u, err := url.ParseRequestURI(config.Host); err == nil && u.Opaque == "" && len(u.Path) > 1 {
		u.RawQuery = ""
		u.Fragment = ""
		config.Host = u.String()
	}

	if err := config.Validate(); err != nil {
		return nil, err
	}

	config.Negotiator = runtime.NewSimpleClientNegotiator()

	return config, nil
}

// 传入配置文件地址，解析后返回 rest.Config
func ConfigFromFile(configPath string) (*Config, error) {
	iamconfigBytes, err := os.ReadFile(configPath)
	if err != nil {
		return nil, err
	}

	config, err := ConfigFromBytes(iamconfigBytes)
	if err != nil {
		return nil, err
	}

	return config, nil
}

func (config *Config) Validate() error {
	return newErrConfigurationInvalid(validateConfig(config))
}
